package com.example.rabbitmqspringboot.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zfj
 * @date 2022/4/26 -16:38
 * 配置类 发布确认（高级）
 */
@Configuration
public class ConfirmConfig {
	public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";
	public static final String CONFIRM_QUEUE_NAME = "confirm.queue";

	//备份交换机
	public static final String BACKUP_EXCHANGE_NAME = "backup.exchange";
	//备份队列
	public static final String BACKUP_QUEUE_NAME = "backup.queue";
	//报警队列
	public static final String WARNING_QUEUE_NAME = "warning.queue";
	//声明业务 Exchange
	//声明确认 Exchange 交换机的备份交换机
	@Bean("confirmExchange")
	public DirectExchange confirmExchange(){
		ExchangeBuilder exchangeBuilder =
				ExchangeBuilder.directExchange(CONFIRM_EXCHANGE_NAME)
						.durable(true)
//设置该交换机的备份交换机
						.withArgument("alternate-exchange", BACKUP_EXCHANGE_NAME);
		return (DirectExchange)exchangeBuilder.build();
	}
	// 声明确认队列
	@Bean("confirmQueue")
	public Queue confirmQueue(){
		return QueueBuilder.durable(CONFIRM_QUEUE_NAME).build();
	}
	// 声明确认队列绑定关系
	@Bean
	public Binding queueBinding(@Qualifier("confirmQueue") Queue queue,
	                            @Qualifier("confirmExchange") DirectExchange exchange){
		return BindingBuilder.bind(queue).to(exchange).with("key1");
	}

	//交换机
	//声明备份 Exchange
	@Bean("backupExchange")
	public FanoutExchange backupExchange(){
		return new FanoutExchange(BACKUP_EXCHANGE_NAME);
	}
	// 声明备份队列
	@Bean("backupQueue")
	public Queue backupQueue(){
		return QueueBuilder.durable(BACKUP_QUEUE_NAME).build();
	}

	// 声明报局队列
	@Bean("warningQueue")
	public Queue warningQueue(){
		return QueueBuilder.durable(WARNING_QUEUE_NAME).build();
	}
	//绑定
	@Bean
	public Binding backupBindingBackupExchange(@Qualifier("backupQueue") Queue backupQueue,
	                                           @Qualifier("backupExchange") FanoutExchange backupExchange){
		return BindingBuilder.bind(backupQueue).to(backupExchange);
	}
	@Bean
	public Binding warningBindingBackupExchange(@Qualifier("warningQueue") Queue warningQueue,
	                                           @Qualifier("backupExchange") FanoutExchange backupExchange){
		return BindingBuilder.bind(warningQueue).to(backupExchange);
	}

}
